﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;

namespace Lilium.Web.Mvc
{
	/// <summary>
	/// Контейнер информации о выполняемом действии.
	/// </summary>
	/// <remarks>
	/// Данный класс близок по смыслу к ControllerContext, т.к. участвует в операциях фильтрации и авторизации, но,
	/// в отличие от ControllerContext не содержит указателя на контроллер, это означает, что контекст может быть
	/// использован для валидаци действий, которые еще на начали выполняться. Это полезно, например, для сокрытия 
	/// недоступных пользователю ссылок. Контекст содержит ссылку на ServiceProvider текущего контроллера, поэтому 
	/// теоретически возможно, что для валидации одних и тех же действий будут использоваться разные сервис-провайдеры
	/// (т.е. один для проверки доступности ссылки с текущего контроллера, другой - непосредственно при выполнении запроса),
	/// Но, считается, что система сервисов сконфигурирована одинаковым образом для всех контроллеров. По сути поле ServiceProvider 
	/// контроллера - это точка доступа к глобальной системе сервисов.
	/// </remarks>
    //TODO: убрать его что-ли?..
	public class ActionContext
	{
		public ActionContext(ActionContext actionContext)
		{
			if (actionContext == null) throw new ArgumentNullException("actionContext");

			m_ServiceProvider = actionContext.ServiceProvider;
		}

		public ActionContext(ControllerContext controllerContext)
		{
			if (controllerContext == null) throw new ArgumentNullException("controllerContext");

			m_ServiceProvider = controllerContext.Controller.GetServiceProvider();
		}

		public ActionContext(IServiceProvider serviceProvider)
		{
			if (serviceProvider == null) throw new ArgumentNullException("serviceProvider");

			m_ServiceProvider = serviceProvider;
		}

		#region public Lilium.IServiceProvider ServiceProvider

		private readonly Lilium.IServiceProvider m_ServiceProvider;

		public Lilium.IServiceProvider ServiceProvider
		{
			get
			{
				return m_ServiceProvider;
			}
		}

		#endregion
	}
}
